/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package model;

import java.util.Scanner;

/**
 *
 * @author Jeppe
 */
public class Spil {

    private String navn;
    private int antalSpillere;
    private int antalRunder; //Umiddelbar unødvendig
    private int spilStatus;
    private boolean winner;
    private int aktiv;
    private Spiller[] spillerArray;
    Spiller forrigeSpiller = new Spiller("forrige"); //"forrige" bruger vi til at anbringe det kort som man vælger at lægge ned i bunken. anvendes kun i runner-metoderne.

    public Spil(String navn) {
        this.navn = navn;
        spilStatus = 1;
    }
    //Opretter deck
    Deck deck1 = new Deck(1, true);
    //Opretter bunke
    Bunke bunke1 = new Bunke("Bunken");
    //Opretter scanneren som sørger for at vi kan kommunikere med programmet fra output-vinduet.
    Scanner scan = new Scanner(System.in);

    public Bunke getBunke() {
        return bunke1;
    }

    public int getSpilStatus() {
        return spilStatus;
    }

    /**
     * Metoden kaldes med den integer som man vil lægge til spilStatus
     *
     * @param spilStatus hvor mange man vil add'e med. af datatypen int.
     */
    public void addSpilStatus(int spilStatus) {
        this.spilStatus = this.spilStatus + 1;
    }

    public void setSpilStatus(int spilStatus) {
        this.spilStatus = spilStatus;
    }

    /**
     * Giver en valgt spiller et valgt antal kort op.
     *
     * @param Spiller = spiller navnet ex: (Spiller1)
     * @param antalKortOp = et antal kort op med datatypen int. ex: (7)
     */
    public void givKort(int spiller, int antalKortOp) {
        for (int i = 1; i <= antalKortOp; i++) {
            if (deck1.getAntalKortIDeck() == 0) {
                System.out.println("Vender bunke");
                Spiller midl = new Spiller("midl");
                midl.tilføjKort(bunke1.getØversteKort());
                bunke1.fjernEtEnkelt(bunke1.getAntalKortIBunke() - 1);
                bunke1.vendBunke();
                for (int j = 0; j < bunke1.getAntalKortIBunke() - 1; j++) {
                    deck1.fjernKortFraBunke(bunke1.getKort(j));
                    bunke1.fjernEtEnkelt(j);
                }
                bunke1.vendKort(midl.lægKortNed(0));
            }
            spillerArray[spiller].tilføjKort(deck1.trækØversteKort());
        }
        System.out.println(spillerArray[spiller].getNavn() + " trækker " + antalKortOp + " kort op.");
    }

    public void flytIArray(Kort[] arr, int pos) {
        Kort sidste = arr[arr.length];

        System.arraycopy(arr, pos, arr, pos + 1, arr.length - pos - 1);

        arr[pos] = sidste;
    }

    public boolean tjekVinder(int spiller) {
        aktiv = spiller;
        if (spillerArray[aktiv].antalKortPåHånd() == 0) {
            winner = true;

        }
        return winner;
    }

    public int nytSpilEllerQuit() {
        String input;
        int i = 0;
        while (i == 0) {
            System.out.println("        Skriv q igen for at lukke programmet\n        Skriv n for at starte et nyt spil ");
            input = scan.nextLine();
            if (input.equals("q") || input.equals("n")) {
                if (input.equals("q")) {
                    System.out.println("Du har valgt at lukke programmet\n Lukker...");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException ex) {
                        Thread.currentThread().interrupt();
                    }
                    System.err.println("GAME OVER");
                    System.exit(0);
                } else {
                    i = 3;
                }
            }
            i++;
        }
        return i;
    }

    /**
     * Tilføjer spillere vha. arrays. Skal ikke kaldes med noget.
     */
    public void tilføjSpiller() {

        //String playerCountStr;
        int antalOpretSpillere;
        String playerCountStr = "Ugyldig";
        int antalKort = 7; //TEST!

        // --- Opret spillere ---
        // Får oplyst antal spillere, så vi kan oprette dem i spillet
        // Sætter maks og min for hvor mange spillere der kan være med
        while (!playerCountStr.matches("\\d+")) {
            System.out.println("Indtast antal spillere");
            playerCountStr = scan.nextLine();
        }
        antalSpillere = Integer.parseInt(playerCountStr);
        antalOpretSpillere = antalSpillere - 1; // Sætter denne variabel lig med antalSpiller-1 da for-løkken længere nede starter på 0.

        if (antalSpillere <= 1) {
            System.out.println("Man skal mindst være 2 spillere for at spille Olsen");
            spilStatus = 0;
        } else if (antalSpillere >= 5) {
            System.out.println("Der må desværre ikke være mere en 4 spillere med. \n Resten må vente til næste spil.");
            spilStatus = 0;
        } else {
            System.out.println("Du har valg at oprette " + antalSpillere + " spillere.");

            //Opret et array til at holde spillernes navne
            String[] navnSpiller;
            navnSpiller = new String[antalSpillere];

            //Kører en løkke for hver spiller
            //Løkken beder brugeren indtaste navn for hver spiller
            //og gemmer svarene i array'et "playerNames".
            for (int i = 0; i <= antalOpretSpillere; i++) {
                System.out.println("Hvad er navnet på spiller " + (i + 1));
                navnSpiller[i] = scan.nextLine();
            }

            //Opret et array der kan holde spiller-objekterne
            spillerArray = new Spiller[antalSpillere];
            //System.out.println("Array oprettet");
            //Opret en løkke der instantierer hvert spiller-objekt med navnet pÃ¥ en spiller.        
            for (int i = 0; i <= antalOpretSpillere; i++) {

                spillerArray[i] = new Spiller(navnSpiller[i]);
                givKort(i, antalKort);

            }
            bunke1.vendKort(deck1.trækØversteKort());
        }
    }

    public void vendFjernBlandOgGivKortIgen() {
        for (int i = 0; i < antalSpillere; i++) { // Fjerner kort fra alle hænder
            for (int j = 1; j < spillerArray[i].antalKortPåHånd() + 1; j++) {
                metodeLægNed(i, j);
            }
        }
        bunke1.vendBunke();
        int antalKortIBunke = bunke1.getAntalKortIBunke();
        for (int i = 0; i < antalKortIBunke; i++) { // Lægger alle kort fra bunken over i decket.
            deck1.fjernKortFraBunke(bunke1.getØversteKort());
        }
        bunke1.tømBunke();
        deck1.shuffle(5);
        for (int i = 0; i < antalSpillere; i++) { //giver kort på ny
            givKort(i, 1); //TEST
        }
        bunke1.vendKort(deck1.trækØversteKort());
        System.out.println("Der gives kort");
    }
    /**
     * Metode der kører spillet. Indeholder regler og kører indtil der er én der
     * ikke har flere kort tilbage på hånden.
     */
    private String curKulør = "Ugyldig øverste";         //MEGET FORBUDT!!!!!!
    private int curKortNum;
    private int kortNumH, kortNumB;
    private String kulørH, kulørB;
    private int runde = 0;                                   //MEGET FORBUDT!!!!!!

    public void runner() {
        System.out.println("\n\nNyt spil er begyndt");
        winner = false;
        int antalToere = 0;
//        int i = 0;
        int i;
        aktiv=0;


        while (aktiv < antalSpillere && !winner && spilStatus == 2) {
            System.out.println("");
//            aktiv = i;
            i=aktiv;
            kulørB = bunke1.getØversteKort().getSuit().toString();
            kortNumB = bunke1.getØversteKort().getNumber();
            System.out.println("Deck: " + deck1.getAntalKortIDeck() + "/52");

            if (runde <= 1) {
                regler(antalToere, aktiv, kortNumB, kulørB);
                tjekVinder(aktiv);
                System.out.println("Runde: " + runde);
            } else {
                curKortNum = forrigeSpiller.getHånd().get(0).getNumber();
                curKulør = forrigeSpiller.getHånd().get(0).getSuit().toString();
                regler(antalToere, aktiv, curKortNum, curKulør);
                tjekVinder(aktiv);
                runde = runde + 1;
                System.out.println("Runde: " + runde);
            }
            if (i == antalSpillere - 1) {
                i = 0;
            } else if (i < 0) {
                i = i - 1 + antalSpillere;
            }

            for (int j = 0; j < 40; j++) { //Tilføjer et valgt antal linier efter hver spiller har fået sin tur.
                System.out.println(" ");
            }
        }
        if (winner) {
            System.out.println("Vi siger tillykke til ,.-~*´¨¯¨`*·~-.¸-(_" + spillerArray[aktiv].getNavn() + "_)-,.-~*´¨¯¨`*·~-.¸ som vandt denne omgang");
        }
    }

    public void tælOgSkrivPoint() {
        System.out.println("\nNuværende point-status:");
        for (int i = 0; i < antalSpillere; i++) {
            spillerArray[i].addPoint(spillerArray[i].getHåndSum());
            System.out.println(spillerArray[i].getNavn() + " har " + spillerArray[i].getPoint() + " point");
            spillerArray[i].udskrivHånd(true);
        }
    }

    public void skiftStartSpiller() {
        Spiller temp;
        System.out.println("Skifter start-spiller");
        temp = spillerArray[0];
        for (int i = 0; i < antalSpillere - 1; i++) {
            spillerArray[i] = spillerArray[i + 1];
        }
        spillerArray[antalSpillere - 1] = temp;

    }

    private void metodeLægNed(int spillerAktiv, int kortNed) {
        if (forrigeSpiller.getHånd().size() >= 1) {
            forrigeSpiller.getHånd().remove(0);
        }
        forrigeSpiller.getHånd().add(0, spillerArray[spillerAktiv].getKort(kortNed));
        bunke1.trækKortFraSpiller(spillerArray[spillerAktiv].lægKortNed(kortNed));
        tjekVinder(spillerAktiv);
    }

    /**
     * Regler spørger spilleren hvad han/hun vil gøre. og lægger kort ned.
     *
     * @param antalToere skal angives for at man kan regne ud hvor mange kort en
     * spiller skal have op hvis der ligger en toer i forvejen.
     * @param i hvilken spiller der er aktiv.
     * @param kortNumB Hvilket nummer det kort har som ligger øverst i bunken.
     * @param kulørB Hvilken kulør det kort har som ligger øverst i bunken.
     */
    private void regler(int antalToere, int i, int kortNumB, String kulørB) {
        curKulør = kulørB;
        curKortNum = kortNumB;
        String input = "ingenting";
        int kortNed;
        if (runde == 0 && curKortNum == 8 || runde == 0 && curKulør.equalsIgnoreCase("Hjerter") && curKortNum == 13) {
            System.out.println(spillerArray[aktiv].getNavn() + " starter. Du må selv vælge hvad du vil lægge ned.");
            input = "ingenting";
            while (!input.equalsIgnoreCase("a")) {
                System.out.println("Skriv a for at fortælle at det kun er dig der kan se skærmen.");
                input = scan.nextLine();
            }
            spillerArray[aktiv].udskrivHånd(true);
            input = "ingenting";
            while (!input.matches("\\d+")) {
                System.out.println("Hvilket kort vil du lægge ned? (Svar med det tal der er ud for kortet)");
                input = scan.nextLine();
            }
            int ekstra = Integer.parseInt(input);
            metodeLægNed(i, ekstra);
            i++;
        } else if (curKortNum == 5 && curKulør.equals("Spar")) { // Hvis Spar 5 ligger øverst.            
            givKort(i, 5);
            i++;
        } else {
            System.out.println(spillerArray[aktiv].getNavn() + "'s tur. Skriv a for at fortælle at det kun er dig der kan se skærmen.");
            input = scan.nextLine();

            //if sætningen sikrer sig at medmindre spilleren trykker "a" vil man blot blive bedt om det igen.
            if (input.equalsIgnoreCase("a")) {
                do {
                    System.out.println("Du skal bekende kulør med en " + curKulør + " eller en " + curKortNum + "'er");
                    spillerArray[aktiv].udskrivHånd(true);

                    System.out.println("Hvilket kort vil du lægge ned? (Svar med det tal der er ud for kortet)\n"
                            + "Hvis du derimod vil trække et kort op skriv 0");

                    input = scan.nextLine();
                    if (input.matches("\\d+")) {
                        kortNed = Integer.parseInt(input);

                        if (kortNed == 0) { //Hvis spilleren har valgt at trække et kort op.
                            if (kortNumB == 2) { //Hvis der er lagt en 2'er i bunken.
                                antalToere++;
                                givKort(i, (2 * antalToere));
                                System.out.println(spillerArray[aktiv].getNavn() + " trækker " + (2 * antalToere) + "kort op");
                                antalToere = 0;
                                i++;
                            } else {
                                givKort(i, 1);
                                i++;
                            }
                        } else if (kortNed > 0) {
                            if (kortNed > spillerArray[aktiv].antalKortPåHånd() + 1) {
                            }
                            kulørH = spillerArray[aktiv].getKort(kortNed).getSuit().toString();
                            kortNumH = spillerArray[aktiv].getKort(kortNed).getNumber();
                            System.out.println("Du har valgt at lægge: " + kulørH + " " + kortNumH + " ned");
                            if (kortNumB == 1 && kortNumH == 1) { //Hvis bunkens øverste kort er et Es                            
                                metodeLægNed(i, kortNed);
                                i++;
                            } else if (kortNumB == 2) { //Hvis bunkens øverste kort er en 2'er.
                                antalToere++;
                                if (spillerArray[aktiv].lægKortNed(kortNed).getNumber() == 2) {
                                    antalToere++;
                                    metodeLægNed(i, kortNed);
                                    i++;
                                } else {
                                    i--;
                                    System.out.println("Det kan du desværre ikke.");
                                }
                            } else if (kortNumB == 3 && kortNumH == 3) { //Hvis bunkens øverste kort er en 3'er.                            
                                metodeLægNed(i, kortNed);
                                i++;
                            } else if (kortNumB == 4 && kortNumH == 4) { //Hvis bunkens øverste kort er en 4'er.                            
                                metodeLægNed(i, kortNed);
                                i++;
                            } else if (kortNumB == 5 && kortNumH == 5) { //Hvis bunkens øverste kort er en 5'er.                            
                                metodeLægNed(i, kortNed);
                                i++;
                            } else if (kortNumB == 6 && kortNumH == 6) { //Hvis bunkens øverste kort er en 6'er.                            
                                metodeLægNed(i, kortNed);
                                i++;
                            } else if (kortNumB == 7 && kortNumH == 7) { //Hvis bunkens øverste kort er en 7'er.                            
                                metodeLægNed(i, kortNed);
                                i++;
                            } else if (kortNumH == 8) {                  //Hvis spiller vælger at lægge en 8'er.                            
                                metodeLægNed(i, kortNed);
                                System.out.println("Hvilken kulør vil du skifte til?");
                                while (!input.equalsIgnoreCase("Hjerter") && !input.equalsIgnoreCase("Spar") && !input.equalsIgnoreCase("Ruder") && !input.equalsIgnoreCase("Klør")) {
                                    input = scan.nextLine();
                                    if (input.equalsIgnoreCase("Spar")) {
                                        curKulør = "Spar";
                                    } else if (input.equalsIgnoreCase("Klør")) {
                                        curKulør = "Klør";
                                    } else if (input.equalsIgnoreCase("Ruder")) {
                                        curKulør = "Ruder";
                                    } else if (input.equalsIgnoreCase("Hjerter")) {
                                        curKulør = "Hjerter";
                                    }
                                }
                                i++;
                            } else if (kortNumB == 9 && kortNumH == 9) { //Hvis bunkens øverste kort er en 9'er.                            
                                metodeLægNed(i, kortNed);
                                i++;
                            } else if (kortNumB == 10 && kortNumH == 10) { //Hvis bunkens øverste kort er en 10'er.                            
                                metodeLægNed(i, kortNed);
                                i++;
                            } else if (kortNumB == 11 && kortNumH == 11) { //Hvis bunkens øverste kort er en Knægt.                            
                                metodeLægNed(i, kortNed);
                                i++;
                            } else if (kortNumB == 12 && kortNumH == 12) { //Hvis bunkens øverste kort er en Dame.                            
                                metodeLægNed(i, kortNed);
                                i++;
                            } else if (kortNumB == 13 && kortNumH == 13) { //Hvis bunkens øverste kort er en Konge.                            
                                if (kulørH.equals("Hjerter")) {
                                    metodeLægNed(i, kortNed);
                                    spillerArray[aktiv].udskrivHånd(true);
                                    System.out.println("Hvilket kort vil du lægge ned oven på Hjerter Konge?(Svar med det tal der er ud for kortet)");
                                    input = "ingenting";
                                    while (!input.matches("\\d")) {
                                        input = scan.nextLine();
                                    }
                                    int ekstra = Integer.parseInt(input);
                                    metodeLægNed(i, ekstra);
                                } else {
                                    metodeLægNed(i, kortNed);
                                }
                                i++;
                            } else if (kulørB.equalsIgnoreCase("Hjerter") && kulørH.equals("Hjerter")) { //Hvis bunkens øverste kort er af kuløren "Hjerter".        *                            
                                metodeLægNed(i, kortNed);
                                i++;
                            } else if (kulørB.equalsIgnoreCase("Spar") && kulørH.equals("Spar")) { //Hvis bunkens øverste kort er af kuløren "Spar".        *                           
                                metodeLægNed(i, kortNed);
                                i++;
                            } else if (kulørB.equalsIgnoreCase("Klør") && kulørH.equals("Klør")) { //Hvis bunkens øverste kort er af kuløren "Klør".        *                           
                                metodeLægNed(i, kortNed);
                                i++;
                            } else if (kulørB.equalsIgnoreCase("Ruder") && kulørH.equals("Ruder")) { //Hvis bunkens øverste kort er af kuløren "Ruder".        *                            
                                metodeLægNed(i, kortNed);
                                i++;
                            } else {
                                System.out.print("Du kan altså ikke lægge " + spillerArray[i].getKort(kortNed).toString(true) + " ned, når du skal lægge en " + curKulør + " ned. ");
                                i--; //spørger spiller igen hvad det egentlig er han vil.
                            }
                            if (kortNumH == 8) {
                                System.out.println("Hvilken kulør vil du skifte til?");
                                while (!input.equalsIgnoreCase("Hjerter") && !input.equalsIgnoreCase("Spar") && !input.equalsIgnoreCase("Ruder") && !input.equalsIgnoreCase("Klør")) {
                                    input = scan.nextLine();
                                    if (input.equalsIgnoreCase("Spar")) {
                                        curKulør = "Spar";
                                    } else if (input.equalsIgnoreCase("Klør")) {
                                        curKulør = "Klør";
                                    } else if (input.equalsIgnoreCase("Ruder")) {
                                        curKulør = "Ruder";
                                    } else if (input.equalsIgnoreCase("Hjerter")) {
                                        curKulør = "Hjerter";
                                    }
                                }
                            }
                            if (winner) {
                                i = antalSpillere + 1;
                            }
                            runde = runde + 1;

                        } else {
                            i--;
                        }

                        if (winner) {
                            i = antalSpillere + 2;
                        }


                    } else if (input.equalsIgnoreCase("q")) {
                        System.out.println(spillerArray[aktiv].getNavn() + " afsluttede spillet");
                        // ----- Gør så main-klassen kalder nytSpilEllerQuit ----- 
                        spilStatus = -1;
                        i = antalSpillere + 1;
                    } else {
                        i--; //Hvis man ikke har tastet en integer eller q ind.
                    }
                    if (i - aktiv > 1) {
                        System.out.println("Der er noget galt med (i)!!!!!");
                    }
                } while (i - aktiv == 1);
                aktiv++;
            } else if (input.equalsIgnoreCase("q")) {
                System.out.println(spillerArray[aktiv].getNavn() + " afsluttede spillet");
                // ----- Gør så main-klassen kalder nytSpilEllerQuit ----- 
                spilStatus = -1;
                i = antalSpillere + 1;
            } else {
                i--; //Hvis man hverken har tastet "a", "0","et tal inden for det antal kort man har på hånden" eller "q".
            }
            if (runde >= 1) {
                curKulør = forrigeSpiller.getHånd().get(0).getSuit().toString();
                curKortNum = forrigeSpiller.getHånd().get(0).getNumber();
            } else {
                runde = 0;
            }
        }
    }
}
